package vip.liux.contracts.models.pay;

import jakarta.persistence.Entity;
import jakarta.persistence.Table;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import vip.liux.contracts.shared.enums.pay.PayNotifyStatus;
import vip.liux.contracts.shared.enums.pay.PayNotifyType;
import vip.liux.domain.entities.auditing.CreationAuditedEntity;

import java.time.LocalDateTime;

@Getter
@Setter
@Entity
@Table(name = "pay_notify_task")
@Accessors(chain = true)
public class PayNotifyTask extends CreationAuditedEntity<Long> {
    /**
     * 通知频率，单位为秒。
     * <p>
     * 算上首次的通知，实际是一共 1 + 8 = 9 次。
     */
    public static final Integer[] NOTIFY_FREQUENCY = new Integer[]{
            15, 15, 30, 180,
            1800, 1800, 1800, 3600
    };

    /**
     * 应用编号
     * <p>
     * 关联 {@link PayApp#getId()}
     */
    private Long appId;

    /**
     * 通知类型
     * <p>
     * 枚举 {@link PayNotifyType}
     */
    private PayNotifyType type;

    /**
     * 数据编号，根据不同 type 进行关联：
     * <p>
     * 1. {@link PayNotifyType#ORDER} 时，关联 {@link PayOrder#getOrderNo()}
     * 2. {@link PayNotifyType#REFUND} 时，关联 {@link PayRefund#getRefundNo()}
     * 3. {@link PayNotifyType#TRANSFER} 时，关联 {@link PayTransfer#getTransferNo()}
     */
    private String dataNo;
    /**
     * 商户订单编号
     */
    private String merchantOrderId;
    /**
     * 商户退款编号
     */
    private String merchantRefundId;
    /**
     * 商户转账编号
     */
    private String merchantTransferId;
    /**
     * 通知状态
     * <p>
     * 枚举 {@link PayNotifyStatus}
     */
    private PayNotifyStatus status;
    /**
     * 下一次通知时间
     */
    private LocalDateTime nextNotifyTime;
    /**
     * 最后一次执行时间
     */
    private LocalDateTime lastExecuteTime;
    /**
     * 当前通知次数
     */
    private Integer notifyTimes;
    /**
     * 最大可通知次数
     */
    private Integer maxNotifyTimes;
    /**
     * 通知地址
     */
    private String notifyUrl;
}
